// Header Protection
#ifndef _GAME_H_
#define _GAME_H_

// Include Files
#include "Definitions.h"

// Namespace
namespace IE
{
	// Forward Declarations
	class CMeshManager;
	class CShaderManager;
	class CTextureManager;

	/////////////////////////////////////////////////////////////////////////////////
	// Contains game data and runs the main game loop.
	class CGame
	{
	public:     // methods
		CGame();
		~CGame();

		void Initialize();
		void Shutdown();

		//public:     // methods
		//
		//	void AddRenderState( CRenderState *_pRenderState );
		//	void RemoveRenderState( CRenderState *_pRenderState );
		//
		//	void AddScriptState( CScriptState *_pScriptState );
		//	void RemoveScriptState( CScriptState *_pScriptState );
		//
		//public:     // events
		//
		//	CEvent<CRenderStateEventArg> RenderStateAdd;
		//	CEvent<CRenderStateEventArg> RenderStateRemove;
		//
		//	CEvent<CScriptStateEventArg> ScriptStateAdd;
		//	CEvent<CScriptStateEventArg> ScriptStateRemove;

		// scene state? then what to do with the 'object'... is there one any more? does it just manage all the states? does that mean we need an object manager as well as a scene manager?
		// does this mean my main thread is turning into the loading thread? it looks that way... and I don't have a problem with it, maybe game contains a list of objects
		//CEvent<CSceneStateEventArg> AddSceneState;
		//CEvent<CSceneStateEventArg> RemoveSceneState;

		//CEvent<CPhysicsStateEventArg> AddPhysicsState;    // physics state? probably...
		//CEvent<CPhysicsStateEventArg> RemovePhysicsState;
		//CEvent<CInputStateEventArg> AddInputState;        // input state? maybe...
		//CEvent<CInputStateEventArg> RemoveInputState;

	private:    // dummy definitions
		CGame( CGame const & );
		CGame & operator =( CGame const & );

	private:     // data

		// main loop
		bool_t m_bRunning;

		// managers
		CMeshManager    *m_pMeshManager;
		CShaderManager  *m_pShaderManager;
		CTextureManager *m_pTextureManager;
	};
}

// Header Protection
#endif // _GAME_H_
